package com.okwanshiwu.service.impls;

import com.okwanshiwu.dao.AppPayDao;
import com.okwanshiwu.dao.AppUserDao;
import com.okwanshiwu.dao.redis.RedisDao;
import com.okwanshiwu.payment.PayTypeMaker;
import com.okwanshiwu.payment.common.PayType;
import com.okwanshiwu.pojo.pay.CommonResult;
import com.okwanshiwu.service.interfaces.Pay;
import com.okwanshiwu.util.UuidUtil;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;


/**
 * 支付实现类
 *
 * @author master
 * @create 2017-07-28 17:29
 **/
@Service("payImpl")
public class PayImpl implements Pay {

	private Logger logger = Logger.getLogger(PayImpl.class);

	@Autowired
	private AppUserDao appUserDao;

	@Autowired
	private AppPayDao appPayDao;

	/**
	 * 生成订单信息(包括订单号)
	 * @param type  支付方式  aliPay和wxPay
	 * @return
	 */
	@Override
	public String createOrderInfo(String type, String userId, String orderType, int price, String content, Map<String,String> other){
		String orderId = createOrderId(userId,orderType);
		PayType pt = PayTypeMaker.getPayType(type);//通过传入type,就能获取不同的支付方式
		return pt.orderInfo(orderId,price,content,other);
	}

	/**
	 * 创建订单号（跟具体的支付方式无关）
	 * @param userId 用户id
	 * @param orderType 订单业务类型（正价、倒贴、购买微信等）
	 * 单列出来的原因是为了能够在用钱包或者别的自有的支付方式的时候产生订单号
	 * @return
	 */
	@Override
	public String createOrderId(String userId,String orderType){
		String numberId = appUserDao.findUserByUserId(userId);//查询用户的numberId
		if(numberId != null){
			String orderId =orderType.concat(UuidUtil.getOrderNo(numberId));//根据类型创建订单
			RedisDao rd = RedisDao.getSingleton();
			if(rd != null){
				rd.set(userId,orderId,60);
			}
			return orderId;
		}
		return "";
	}

	/**
	 * 查询订单支付结果(不验证价格)
	 * @return
	 */
	@Override
	public boolean checkOrderResult(String payType,String orderId) {
		PayType pt = PayTypeMaker.getPayType(payType);//通过传入type,就能获取不同的支付方式
		return pt.getOrderResult(orderId);
	}
	/**
	 * 查询订单支付结果(验证价格)
	 * @return
	 */
	@Override
	public boolean checkOrderResult(String payType, String orderId, int price) {
		PayType pt = PayTypeMaker.getPayType(payType);//通过传入type,就能获取不同的支付方式
		return pt.getOrderResult(orderId,price);
	}

	/**
	 * 支付回调处理订单
	 * @return
	 */
	@Override
	public boolean handleOrder(Map map,String payType) {
		PayType pt = PayTypeMaker.getPayType(payType);
		//数据校验和数据清理   因为微信跟支付宝的数据的字段不一致，需要进行数据的整理
		CommonResult cr = PayTypeMaker.getCallBackMap(map,payType);
		if(pt != null && cr != null){
			return pt.handlerOrder(cr);
		}
		logger.error("出现不支持的支付订单处理方式，完整信息为："+payType);
		return false;

	}
}
